package test.netty.common.pojos;

import java.io.Serializable;
import java.util.*;

/**
 * 返回信息封装
 **/
public class ResultDTO<T> implements Serializable {
    private static final long serialVersionUID = 5386487466150641556L;

    /**
     * 提示信息
     */
    private String message;

    /**
     * 返回结果值
     */
    private T value;

    /**
     * 成功失败标识(true/false)
     */
    private boolean success;

    /**
     * 消息代码
     */
    private String msgCode;

    /**
     * 其他结果值Map
     */
    private Map<Object, Object> resultMap;

    /**
     * 消息提示参数
     */
    private List<String> msgParams;


    private ResultDTO() {

    }

    /**
     * 生成成功结果
     * @param value 结果值
     * @return 结果Dto对象
     */
    public static <T> ResultDTO<T> valueOfSuccess(T value) {
        ResultDTO<T> vo = new ResultDTO<T>();
        vo.value = value;
        vo.success = true;
        return vo;
    }

    /**
     * 生成成功结果
     * @return 结果Dto对象
     */
    public static <T> ResultDTO<T> valueOfSuccess() {
        return valueOfSuccess(null);
    }


    /**
     * 生成失败结果
     * @param msg 消息内容
     * @param msgCode 消息代码
     * @param msgParam 失败结果值
     * @return 结果Dto对象
     */
    public static <T> ResultDTO<T> valueOfError(String msg, String msgCode, String... msgParam) {
        ResultDTO<T> vo = new ResultDTO<T>();
        vo.message = msg;
        vo.success = false;
        vo.msgCode = msgCode;
        vo.addMsgParams(msgParam);
        return vo;
    }

    /**
     * 生成失败结果
     * @param msgCode 消息代码
     * @return 结果Dto对象
     */
    public static <T> ResultDTO<T> valueOfError(String msgCode) {
        return valueOfError("", msgCode, "");
    }

    /**
     * 生成失败结果
     * @param msg 消息内容
     * @param msgCode 消息代码
     * @param msgParam 消息参数
     * @return 结果Dto对象
     */
    public static <T> ResultDTO<T> valueOfError(String msg, int msgCode, String... msgParam) {
        return valueOfError(msg, msgCode + "", msgParam);
    }

    /**
     * 生成失败结果
     * @param msg 消息内容
     * @param msgCode 消息代码
     * @return 结果Dto对象
     */
    public static <T> ResultDTO<T> valueOfError(String msg, String msgCode) {
        return valueOfError(msg, msgCode, "");
    }

    /**
     * 增加返回结果值
     * @param key 结果键值
     * @param value 结果值
     */
    public void addResult(String key, Object value) {
        this.getResultMap().put(key, value);
    }

    /**
     * 获取返回结果
     * @param key 结果键值
     * @return 结果值
     */
    @SuppressWarnings("unchecked")
    public <E> E getResult(String key) {
        return (E) this.getResultMap().get(key);
    }

    /**
     * 获取消息内容
     * @return 消息内容
     */
    public String getMessage() {
        return message;
    }

    /**
     * 设置消息内容
     * @param message 消息
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 获取消息值
     * @return 消息值
     */
    public T getValue() {
        return value;
    }

    /**
     * 设置消息值
     * @param value 消息值
     */
    public void setValue(T value) {
        this.value = value;
    }

    /**
     * 获取是否成功标志
     * @return 是否成功标志
     */
    public boolean isSuccess() {
        return success;
    }

    /**
     * 设置是否成功标志
     * @param success 是否成功标志
     */
    public void setSuccess(boolean success) {
        this.success = success;
    }

    /**
     * 获取消息代码
     * @return 消息代码
     */
    public String getMsgCode() {
        return msgCode;
    }

    /**
     * 设置消息代码
     * @param msgCode 消息代码
     */
    public void setMsgCode(String msgCode) {
        this.msgCode = msgCode;
    }

    /**
     * 获取结果集合
     * @return 结果集合
     */
    public Map<Object, Object> getResultMap() {
        if (this.resultMap == null) {
            this.resultMap = new HashMap<>();
        }

        return resultMap;
    }

    /**
     * 设置结果集合
     * @param resultMap 结果集合
     */
    public void setResultMap(Map<Object, Object> resultMap) {
        this.resultMap = resultMap;
    }

    /***
     * 添加消息参数
     * @param param 消息参数
     **/
    public void addMsgParams(String... param) {
        if (msgParams == null) {
            msgParams = new ArrayList<>();
        }

        if (param == null || param.length == 0) {
            return;
        }

        msgParams.addAll(Arrays.asList(param));
    }

    /**
     * 获取消息参数列表
     * @return 消息参数列表
     */
    public List<String> getMsgParams() {
        return msgParams;
    }

    /**
     * 设置消息参数列表
     * @param msgParams 消息参数列表
     */
    public void setMsgParams(List<String> msgParams) {
        this.msgParams = msgParams;
    }
}

